const express = require('express');
const app = express();

// 使用中间件 => 添加允许跨域的响应头 => 解决跨域问题
app.use(function (req, res, next) {
    res.setHeader('Access-Control-Allow-Origin', "http://127.0.0.1:5500");  // 允许跨域请求
    res.setHeader('Access-Control-Allow-Origin', '*');  // 允许跨域请求
    res.setHeader('Access-Control-Allow-Headers', "*"); // 该响应头 允许客户端可以设置『自定义』请求头  
    res.setHeader('Access-Control-Allow-Methods', "*"); // 允许各种请求方式进行跨域请求 get post delete put
    next();
});

// 使用中间件 => 解析请求体参数
app.use(express.urlencoded({ extended: false }))
app.use(express.json())
// 使用中间件 => 部署静态资源
app.use(express.static('public'))

// 注册路由 (任意类型请求)
app.all('/server/:id', (req, res) => {
    console.log('收到了请求: ', req.method)

    console.log('query参数: ', req.query)
    console.log('params参数: ', req.params)
    console.log('body参数:', req.body)

    res.send('HELLO AJAX 123456789')
});

// 返回文本的路由
app.all('/text-server', (req, res) => {
    console.log('/text-server 收到了请求')
    // 返回一般文本数据
    res.send('文本响应数据');
})


// 返回json的路由
app.all('/json-server', (req, res) => {
    console.log('/json-server 收到了请求')

    // res.statusCode= 405

    // 返回json数据
    res.json({
        code: '3',
        msg: '此用户名已经存在'
    });
})

// 返回动态的时间值
app.all('/time-server', (req, res) => {
    console.log('/time-server 收到了请求')

    // 返回json数据
    res.json({
        time: Date.now()
    });
})

//延时响应
app.all('/delay-server', (req, res) => {
    console.log('/delay-server 服务器正在处理请求')
    setTimeout(() => {
        res.send('这是一个响应哦!');
    }, 5000);
});

// 测试同源策略的路由
app.get('/origin-server', (req, res) => {
    res.send({ status: 200, data: { name: 'tom', age: 12 } })
});


// 使用json解决跨域的路由
app.get('/jsonp-server', (req, res) => {
    // 确定要返回的响应数据
    let data = { name: '孙悟空', age: 18 };
    // 读取函数名参数
    let callback = req.query.callback;
    // 返回一段js代码: 函数名(数据)
    res.send(`${callback}(${JSON.stringify(data)})`);
});

const allProducts = [
    { id: 1, name: 'A1', price: 20 },
    { id: 2, name: 'A2', price: 30 },
    { id: 3, name: 'A3', price: 35 },
    { id: 4, name: 'B1', price: 40 },
    { id: 5, name: 'B2', price: 35 }
]
// 处理ajax简单封装的请求
app.get('/prodcuts/:name', (req, res) => {
    // res.statusCode = 406
    const { name } = req.params
    const { price } = req.query
    // 过滤出满足条件的商品列表
    // 商品名包含name
    // 商品价格大于price
    const products = allProducts.filter(p => p.name.includes(name) && p.price >= price)
    res.send(products)
})

app.post('/prodcuts/add', (req, res) => {
    const p = req.body
    p.id = Date.now()
    allProducts.push(p)
    res.send(allProducts)
})


app.listen(8081, () => {
    console.log('8081 端口服务已经启动....');
})
